package com.cskaoyan.javase.oop3._3lambda._1basic;

/**
 * Lambda表达式的语法:
 * (形参列表) -> {
 *    // 方法体
 *  }
 *
 * Lambda表达式能够简化的前提是：
 *      它是功能接口的子类对象，而功能接口中有且只有一个必须要实现的抽象方法！
 *
 * Lambda表达式语法的简化:
 *      1."(形参列表)"能不能简化呢?
 *          可以
 *          形参的数据类型是完全可以不写的,因为写不写,数据类型都是固定的,是不可能发生变化的
 *          所以形参的数据类型完全可以不写,省略即可
 *
 *          特殊的,当形参的个数有且只有一个时,可以"()"和数据类型一起省略,直接写形参名即可.
 *          但是要注意,如果方法是无参的,那就直接照抄空的大括号即可,这时不能省略
 *
 *      2."{}"能不能简化呢?
 *          可以
 *          当Lambda表达式重写的抽象方法的方法体,只有一条语句时,可以去掉大括号
 *          最特殊时,
 *          当重写方法体的语句,仅一条,且就是返回值return语句时
 *          可以"return"和"{}"一起省略
 *
 *      以上简化,我们最希望去掉的是"{}",但实际开发中,不太可能一条语句就能够写完一个方法的实现
 *      这时,"{}"就不能去掉了
 *      那怎么办呢?
 *      这时就需要使用Lambda表达式的特殊语法: "方法引用"
 *
 *
 * @since 17:46
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        INoReturnTwoParam ip = (int a, int b) -> {
            System.out.println("sum = " + (a + b));
        };
        ip.test(10, 10);

        // 上述Lambda表达式可以简化为:
        INoReturnTwoParam ip2 = (a, b) -> {
            System.out.println("sum = " + (a + b));
        };
        ip.test(20, 20);

        INoReturnOneParam ip3 = a -> {
            System.out.println("hello world!");
            System.out.println(a);
            System.out.println("hello world!");
        };
        ip3.test(666);

        INoReturnNoParam ip4 = () -> System.out.println("我今天晚上吃拉面~~");
        ip4.test();

        IHasReturnNoParam ip5 = () -> 777;
        System.out.println(ip5.test());

    }
}

//无返回值无参数的功能接口
@FunctionalInterface
interface INoReturnNoParam {
    void test();
}

//无返回值有一个参数的功能接口
@FunctionalInterface
interface INoReturnOneParam {
    void test(int a);
}

//无返回值两个参数的功能接口
@FunctionalInterface
interface INoReturnTwoParam {
    void test(int a, int b);
}

//有返回值无参数的功能接口
@FunctionalInterface
interface IHasReturnNoParam {
    int test();
}

//有返回值一个参数的功能接口
@FunctionalInterface
interface IHasReturnOneParam {
    int method(int a);
}

//有返回值两个参数的功能接口
@FunctionalInterface
interface IHasReturnTwoParam {
    int test(int a, int b);
}